home *** CD-ROM | disk | FTP | other *** search
/ Computer Select (Limited Edition) / Computer Select.iso / dobbs / v17n05 / drmdos.asc < prev    next >
Encoding:
Text File  |  1992-03-30  |  20.4 KB  |  489 lines

  1. _MULTIUSER DOS FOR CONTROL SYSTEMS, PART II_
  2. by Richard Kryszak
  3.  
  4.  
  5. [LISTING ONE]
  6.  
  7. /* file name: system.c */
  8.  
  9. #include <dos.h>
  10. #include "queues.h"
  11. #include <stdio.h>
  12.  
  13. /*===============*/
  14. /* local defines */
  15. /*===============*/
  16. #define CCPM        0xE0        /* cdos call int value */
  17. #define C_DETACH    0x93        /* console detach CL register value */
  18. #define P_DELAY     0x8D        /* process delay CL register value */
  19. #define P_DISPATCH  0x8E        /* process dispatch CL register value */
  20. #define P_PRIOR     0x91        /* process priority CL register value */
  21. #define Q_CREAD     0x8A        /* queue cread CL register value */
  22. #define Q_CWRITE    0x8C        /* queue cwrite CL register value */
  23. #define Q_MAKE      0x86        /* queue make CL register value */
  24. #define Q_OPEN      0x87        /* queue open CL register value */
  25. #define Q_READ      0x89        /* queue read CL register value */
  26. #define Q_WRITE     0x8B        /* queue write CL register value */
  27. #define S_MEMORY    0x59        /* system memory allocation request */
  28.  
  29. /*=====================*/
  30. /* function prototypes */
  31. /*=====================*/
  32. unsigned int c_detach(void);
  33. void p_dispatch(void);
  34. void p_priority(unsigned char data);
  35. void p_delay(unsigned int del);
  36. unsigned int far *  s_memory(int mem_size);
  37. int q_make(struct q_descriptor *descript_ptr,
  38.        unsigned int msg_length,
  39.        unsigned int num_msg,
  40.        char que_name[8],
  41.        int *err_ptr);
  42. int q_open(struct q_parameter_blk *param_blk_ptr,
  43.        char que_name[8],
  44.        int *err_ptr);
  45. int q_read(struct q_parameter_blk *param_blk_ptr,
  46.        unsigned char *buff_ptr,
  47.        int *err_ptr);
  48. int q_write(struct q_parameter_blk *param_blk_ptr,
  49.         unsigned char *buff_ptr,
  50.         int *err_ptr);
  51. int q_cread(struct q_parameter_blk *param_blk_ptr,
  52.         unsigned char *buff_ptr,
  53.         int *err_ptr);
  54. int q_cwrite(struct q_parameter_blk *param_blk_ptr,
  55.          unsigned char *buff_ptr,
  56.          int *err_ptr);
  57.  
  58. /*======================*/
  59. /* function definitions */
  60. /*======================*/
  61. unsigned int c_detach()
  62.    { union REGS inregs,outregs;
  63.  
  64.      inregs.h.cl = C_DETACH;                    /* detach function call */
  65.      int86(CCPM,&inregs,&outregs);              /* call cdos */
  66.      return(outregs.x.ax);                      /* return call status */
  67.    }
  68. void p_dispatch()
  69.    { union  REGS inregs,outregs;
  70.  
  71.      inregs.h.cl = P_DISPATCH;                  /* dispatch function call */
  72.      int86(CCPM,&inregs,&outregs);              /* call cdos */
  73.    }
  74. void p_priority(unsigned char priority)
  75.    { union REGS inregs,outregs;
  76.  
  77.      inregs.h.cl = P_PRIOR;                     /* priority change call */
  78.      inregs.h.dl = priority;                    /* desired priority */
  79.      int86(CCPM,&inregs,&outregs);              /* call cdos */
  80.    }
  81. void p_delay(unsigned int del)
  82.    { union  REGS inregs,outregs;
  83.      inregs.h.cl = P_DELAY;                     /* delay function call */
  84.      inregs.x.dx = del;                         /* number of ticks */
  85.      int86(CCPM,&inregs,&outregs);              /* call cdos */
  86.    }
  87. unsigned int far * s_memory(int mem_size)
  88.    { union  REGS inregs,outregs;
  89.      struct SREGS seg_regs;                     /* segment registers */
  90.      unsigned int _far *mem_ptr=NULL;           /* pointer to memory block */
  91.      mem_size *= 2;                             /* compute # of bytes */
  92.      inregs.h.cl = S_MEMORY;                    /* system memory allocation */
  93.      inregs.x.dx = mem_size;                    /* # of bytes requested */
  94.      int86x(CCPM,&inregs,&outregs,&seg_regs);   /* call cdos */
  95.      if(outregs.x.ax == 0xFFFF)                 /* if not successful */
  96.     { return(NULL);                         /* return a null pointer */
  97.     }
  98.      mem_ptr = (unsigned int far *)
  99.             ((0x10000 * seg_regs.es)
  100.              + outregs.x.ax);           /* convert into a pointer */
  101.      return(mem_ptr);                           /* return the pointer */
  102.    }
  103. int q_make(struct q_descriptor *descript_ptr,
  104.        unsigned int msg_length,
  105.        unsigned int num_msg,
  106.        char que_name[8],
  107.        int *err_ptr)
  108.    { int int86_error;                           /* return status */
  109.      int i;                                     /* index variable */
  110.      union REGS inregs, outregs;                /* processor registers */
  111.      struct SREGS seg_regs;                     /* segment registers */
  112.      segread(&seg_regs);                        /* read segment registers */
  113.      descript_ptr->internal_1 = 0;              /* must be 0 */
  114.      descript_ptr->internal_2 = 0;              /* must be 0 */
  115.      descript_ptr->internal_3 = 0;              /* must be 0 */
  116.      descript_ptr->internal_4 = 0;              /* must be 0 */
  117.      descript_ptr->internal_5 = 0;              /* must be 0 */
  118.      descript_ptr->internal_6 = 0;              /* must be 0 */
  119.      descript_ptr->msglen = msg_length;         /* add message length */
  120.      descript_ptr->nmsgs = num_msg;             /* add number of messages */
  121.      descript_ptr->flags = 0;                   /* no flags used */
  122.      for(i = 0; i < 8;  ++i)                    /* copy queue name */
  123.     { descript_ptr->name[i]=que_name[i];
  124.     }
  125.      descript_ptr->buffer = 0;                  /* buffer in system area */
  126.      inregs.h.cl = Q_MAKE;                      /* queue make call */
  127.      inregs.x.dx = FP_OFF(descript_ptr);        /* put offset into dx */
  128.      int86_error=int86x(CCPM,&inregs,
  129.             &outregs,&seg_regs);    /* call cdos */
  130.      *err_ptr = outregs.x.cx;                   /* write error code */
  131.      return(int86_error);                       /* int86 return status */
  132.    }
  133. int q_open(struct q_parameter_blk *param_blk_ptr,
  134.        char que_name[8],
  135.        int *err_ptr)
  136.    { int int86_error;                           /* return status */
  137.      int i;                                     /* index variable */
  138.      union REGS inregs, outregs;                /* processor registers */
  139.      struct SREGS seg_regs;                     /* segment registers */
  140.      segread(&seg_regs);                        /* read segment registers */
  141.      param_blk_ptr->internal_1 = 0;             /* must be 0 */
  142.      param_blk_ptr->internal_2 = 0;             /* must be 0 */
  143.      for(i = 0; i < 8;  ++i)
  144.     { param_blk_ptr->name[i] = que_name[i]; /* copy queue name */
  145.     }
  146.      inregs.h.cl = Q_OPEN;                      /* q_open call */
  147.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  148.      int86_error=int86x(CCPM,&inregs,
  149.             &outregs,&seg_regs);    /* call cdos */
  150.      *err_ptr = outregs.x.cx;                   /* write error code */
  151.      return(int86_error);                       /* int86 return status */
  152.    }
  153. int q_write(struct q_parameter_blk *param_blk_ptr,
  154.         unsigned char *buff_ptr,
  155.         int *err_ptr)
  156.    { int int86_error;                           /* return status */
  157.      union REGS inregs, outregs;                /* processor registers */
  158.      struct SREGS seg_regs;                     /* segment registers */
  159.      segread(&seg_regs);                        /* read segment registers */
  160.      param_blk_ptr->buffer=FP_OFF(buff_ptr);    /* pointer to the buffer */
  161.      inregs.h.cl = Q_WRITE;                     /* q_write call */
  162.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  163.      int86_error=int86x(CCPM,&inregs, &outregs,&seg_regs);    /* call cdos */
  164.      *err_ptr = outregs.x.cx;                   /* write error code */
  165.      return(int86_error);                       /* int86 return status */
  166.    }
  167. int q_read(struct q_parameter_blk *param_blk_ptr,
  168.        unsigned char *buff_ptr,
  169.        int *err_ptr)
  170.    { unsigned int int86_error;                  /* return status */
  171.      union REGS inregs, outregs;                /* processor registers */
  172.      struct SREGS seg_regs;                     /* segment registers */
  173.      segread(&seg_regs);                        /* read segment registers */
  174.      param_blk_ptr->buffer=FP_OFF(buff_ptr);    /* pointer to the buffer */
  175.      inregs.h.cl = Q_READ;                      /* q_read call */
  176.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  177.      int86_error=int86x(CCPM,&inregs,&outregs,&seg_regs); /* int86 call */
  178.      *err_ptr = outregs.x.cx;                   /* write error code */
  179.      return(int86_error);                       /* int86 return status */
  180.    }
  181. int q_cwrite(struct q_parameter_blk *param_blk_ptr,unsigned char *buff_ptr,
  182.                                                                  int *err_ptr)
  183.    { int int86_error;                           /* return status */
  184.      union REGS inregs, outregs;                /* processor registers */
  185.      struct SREGS seg_regs;                     /* segment registers */
  186.      segread(&seg_regs);                        /* read segment registers */
  187.      param_blk_ptr->buffer=FP_OFF(buff_ptr);    /* pointer to the buffer */
  188.      inregs.h.cl = Q_CWRITE;                    /* q_write call */
  189.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  190.      int86_error=int86x(CCPM,&inregs,&outregs,&seg_regs);    /* call cdos */
  191.      *err_ptr = outregs.x.cx;                   /* write error code */
  192.      return(int86_error);                       /* int86 return status */
  193.    }
  194. int q_cread(struct q_parameter_blk *param_blk_ptr,unsigned char *buff_ptr,
  195.                                                         int *err_ptr)
  196.    { int int86_error;                           /* return status */
  197.      union REGS inregs, outregs;                /* processor registers */
  198.      struct SREGS seg_regs;                     /* segment registers */
  199.      segread(&seg_regs);                        /* read segment registers */
  200.      param_blk_ptr->buffer=FP_OFF(buff_ptr);    /* pointer to the buffer */
  201.      inregs.h.cl = Q_CREAD;                     /* q_cread call */
  202.      inregs.x.dx = FP_OFF(param_blk_ptr);       /* put offset into dx */
  203.      int86_error=int86x(CCPM,&inregs,&outregs,&seg_regs);    /* call cdos */
  204.      *err_ptr = outregs.x.cx;                   /* write error */
  205.      return(int86_error);                       /* int86 return status */
  206.    }
  207.  
  208.  
  209.  
  210.  
  211. [LISTING TWO]
  212.  
  213. /* file name: queues.h */
  214.  
  215. struct q_descriptor
  216. { unsigned int internal_1;      /* for internal use ; must be zero */
  217.   unsigned int internal_2;      /* for internal use ; must be zero */
  218.   int flags;                    /* for internal use ; queue flags */
  219.   char name[8];                 /* queue name */
  220.   int msglen;                   /* number of bytes in each logical message */
  221.   int nmsgs;                    /* maximum number of messages supported */
  222.   unsigned int  internal_3;     /* for internal use ; must be zero */
  223.   unsigned int  internal_4;     /* for internal use ; must be zero */
  224.   unsigned int  internal_5;     /* for internal use ; must be zero */
  225.   unsigned int  internal_6;     /* for internal use ; must be zero */
  226.   unsigned int  buffer;         /* address of the queue buffer */
  227.  };
  228.  
  229. struct q_parameter_blk
  230. { unsigned int internal_1;      /* for internal use ; must be zero */
  231.   int queueid;                  /* queue number field ; filled by q_open */
  232.   unsigned int internal_2;      /* for internal use ; must be zero */
  233.   unsigned int buffer;          /* offset of queue message buffer */
  234.   char name[8];                 /* queue name */
  235.  };
  236.  
  237.  
  238.  
  239. [LISTING THREE]
  240.  
  241. /* file name: database.c */
  242.  
  243. #include <stdio.h>
  244. #include "queues.h"
  245.  
  246. /*=====================*/
  247. /* function prototypes */
  248. /*=====================*/
  249. void main(void);
  250.  
  251. /*===============*/
  252. /* local defines */
  253. /*===============*/
  254. #define Q_DEPTH         1               /* queue contains 1 message */
  255. #define DBASE_SIZE      2048            /* size of the database */
  256. #define TRUE            1
  257.  
  258. /*================================*/
  259. /* external function declarations */
  260. /*================================*/
  261. extern unsigned int c_detach(void);
  262. extern void p_delay(unsigned int del);
  263. extern unsigned int far *s_memory(int mem_size);
  264. extern int q_make(struct q_descriptor *descript_ptr,
  265.           unsigned int msg_length,
  266.           unsigned int num_msg,
  267.           char que_name[8],
  268.           int *err_ptr);
  269. extern int q_open(struct q_parameter_blk *param_blk_ptr,
  270.           char que_name[8],
  271.           int *err_ptr);
  272. extern int q_write(struct q_parameter_blk *param_blk_ptr,
  273.            unsigned char *buff_ptr,
  274.            int *err_ptr);
  275. /*=====================*/
  276. /* function definition */
  277. /*=====================*/
  278. void main()
  279.    { int result;                                /* result of q_make */
  280.      int error_type;                            /* cdos return code */
  281.      union base
  282.     { unsigned int far *base_ptr;
  283.       unsigned char base[sizeof(unsigned int far *)];
  284.     }base_union;                             /* composite pointer */
  285.      struct q_descriptor dbase_descript;         /* descriptor block */
  286.      struct q_parameter_blk dbase_parameters;    /* parameter block */
  287.      base_union.base_ptr = s_memory(DBASE_SIZE); /* request system memory */
  288.      if(base_union.base_ptr == NULL)             /* if NULL pointer */
  289.     { puts("No System Memory Available");    /* print an error message */
  290.       exit(-1);                              /* exit, memory error */
  291.     }
  292.      result = q_make(&dbase_descript,            /* pointer to descriptor */
  293.              sizeof(base_union),         /* length of messages */
  294.               Q_DEPTH,               /* number of messages */
  295.               "database",            /* queue name */
  296.               &error_type);          /* error return */
  297.       result = q_open(&dbase_parameters,     /* pointer to parameter */
  298.               "database",            /* queue name */
  299.               &error_type);          /* error return */
  300.       result = q_cwrite(&dbase_parameters,   /* write to queue */
  301.                 &base_union.base[0], /* pointer to database */
  302.                 &error_type);        /* error return */
  303.       c_detach();                            /* detach from console */
  304.       while(TRUE)                            /* loop */
  305.         { p_delay(1800);                 /* delay 30 seconds */
  306.         }
  307.     }
  308. /* NOTE: DATABASE.EXE is made up of database.c and system.c */
  309.  
  310.  
  311. [LISTING FOUR]
  312.  
  313. /* file name: dbsuport.c */
  314.  
  315. #include <stdio.h>
  316. #include "queues.h"
  317.  
  318. /*=====================*/
  319. /* function prototypes */
  320. /*=====================*/
  321. void dbopen(void);
  322. unsigned int dbread(int index);
  323. void dbwrit(int index, unsigned int value);
  324. unsigned int far *open_dbase(void);
  325.  
  326. /*==============================*/
  327. /* external function prototypes */
  328. /*==============================*/
  329. extern int q_open(struct q_parameter_blk *param_blk_ptr,
  330.        char que_name[8],
  331.        int *err_ptr);
  332. extern void p_dispatch(void);
  333. extern int q_read(struct q_parameter_blk *param_blk_ptr,
  334.           unsigned char *buff_ptr,
  335.           int *err_ptr);
  336. extern int q_write(struct q_parameter_blk *param_blk_ptr,
  337.            unsigned char *buff_ptr,
  338.            int *err_ptr);
  339.  
  340. /*================*/
  341. /* global storage */
  342. /*================*/
  343. unsigned int far *dbase_ptr;                    /* pointer to database */
  344.  
  345. /*===============*/
  346. /* local defines */
  347. /*===============*/
  348. #define FAILURE         1
  349. #define SUCCESS         0
  350.  
  351. /*======================*/
  352. /* function definitions */
  353. /*======================*/
  354. void dbopen()
  355.    { dbase_ptr = NULL;                             /* initialize pointer */
  356.      while(dbase_ptr == NULL)                   /* loop while still NULL */
  357.     { dbase_ptr = open_dbase();             /* call open database */
  358.     }
  359.    }
  360. void dbwrit(int index, unsigned int value)
  361.     { *(dbase_ptr + index) = value;        /* write value to database */
  362.     }
  363. unsigned int dbread(int index)
  364.     { return(*(dbase_ptr + index));        /* return value at index */
  365.     }
  366. unsigned int far *open_dbase()
  367.    { struct q_parameter_blk dbase_parameters;   /* parameter block */
  368.      int result;                                /* result of q_make */
  369.      int error_type;                            /* cdos return code */
  370.      union base
  371.     { unsigned int far *base_ptr;
  372.       unsigned char base[sizeof(unsigned int far *)];
  373.     }base_union;                            /* composite pointer */
  374.      result = FAILURE;                          /* preset the variable */
  375.      while(result != SUCCESS)                   /* loop til we can open */
  376.     { result = q_open(&dbase_parameters,    /* pointer to param block */
  377.               "database",           /* queue name */
  378.               &error_type);         /* error type return */
  379.       p_dispatch();                         /* let someone else run */
  380.     }
  381.      result = q_read(&dbase_parameters,         /* read the dbase_queue */
  382.              &base_union.base[0],       /* msg read is in union */
  383.              &error_type);              /* error return type */
  384.      result = q_write(&dbase_parameters,        /* write to dbase_queue */
  385.               &base_union.base[0],      /* msg sent is pointer */
  386.               &error_type);             /* error return type */
  387.      return(base_union.base_ptr);               /* return the pointer */
  388.    }
  389.  
  390.  
  391. [LISTING FIVE]
  392.  
  393. /* file name ioboard.c */
  394.  
  395. #include <conio.h>
  396.  
  397. /*====================*/
  398. /* function prototype */
  399. /*====================*/
  400. void main(void);
  401.  
  402. /*==============================*/
  403. /* external function prototypes */
  404. /*==============================*/
  405. extern void dbopen(void);
  406. extern void dbwrit(int index, unsigned int value);
  407. extern unsigned int dbread(int index);
  408. extern unsigned int c_detach(void);
  409. extern void p_priority(unsigned char data);
  410. extern void p_delay(unsigned int del);
  411.  
  412. /*===============*/
  413. /* local defines */
  414. /*===============*/
  415. #define INPUT_BASE_ADDR  0x300                  /* hardware input address */
  416. #define OUTPUT_BASE_ADDR 0x300                  /* hardware output address */
  417. #define DBASE_WRITE_ADDR 0                      /* database write location */
  418. #define DBASE_READ_ADDR  1                      /* database read location */
  419. #define TRUE             1
  420.  
  421. /*=====================*/
  422. /* function definition */
  423. /*=====================*/
  424. void main()
  425.    { unsigned int temp_data;                    /* for reading database */
  426.      p_priority(199);                           /* set priority */
  427.      dbopen();                                  /* link to database */
  428.      c_detach();                                /* detach from console */
  429.      while(TRUE)
  430.     { temp_data = inp(INPUT_BASE_ADDR);     /* read data from port */
  431.       dbwrit(DBASE_WRITE_ADDR, temp_data);  /* write to the database */
  432.       temp_data = dbread(DBASE_READ_ADDR);  /* read data from database */
  433.       outp(OUTPUT_BASE_ADDR+3, temp_data);  /* write to output port */
  434.       p_delay(3);                           /* delay for 50 ms */
  435.     }
  436.    }
  437.  
  438. /* NOTE: IOBOARD.EXE is made up of ioboard.c, system.c, and dbsuport.c */
  439.  
  440.  
  441.  
  442. [LISTING SIX]
  443.  
  444. /* file name logic.c */
  445.  
  446. /*====================*/
  447. /* function prototype */
  448. /*====================*/
  449. void main(void);
  450.  
  451. /*==============================*/
  452. /* external function prototypes */
  453. /*==============================*/
  454. extern void dbopen(void);
  455. extern unsigned int dbread(int index);
  456. extern void dbwrit(int index, unsigned int value);
  457. extern unsigned int c_detach(void);
  458. extern void p_dispatch(void);
  459.  
  460. /*===============*/
  461. /* local defines */
  462. /*===============*/
  463. #define DATA_IN  0                      /* data written by I/O process */
  464. #define DATA_OUT 1                      /* data read by I/O process */
  465. #define TRUE     1
  466.  
  467. /*=====================*/
  468. /* function definition */
  469. /*=====================*/
  470. void main()
  471.    { static unsigned int last_data_read;        /* old data retainer */
  472.      unsigned int temp_data;                    /* for reading database */
  473.  
  474.      dbopen();                                  /* link to database */
  475.      c_detach();                                /* detach from console */
  476.      while(TRUE)                                /* continuous loop */
  477.     { temp_data = dbread(DATA_IN);          /* read input data */
  478.       if(temp_data ^ last_data_read)        /* if there was a change */
  479.          { dbwrit(DATA_OUT, ~temp_data);    /* write the to the port */
  480.            last_data_read = temp_data;      /* save the new value */
  481.          }
  482.       p_dispatch();                         /* let another process run */
  483.     }
  484.    }
  485. /* NOTE: LOGIC.EXE is made up of logic.c, system.c, and dbsuport.c */
  486.  
  487.  
  488.  
  489.